package cn.thr.pethome.pet.service.impl;

import cn.thr.pethome.constants.BaseConstants;
import cn.thr.pethome.department.domain.Department;
import cn.thr.pethome.jwt.LoginContextUtils;
import cn.thr.pethome.pet.domain.Pet;
import cn.thr.pethome.pet.domain.PetDetail;
import cn.thr.pethome.pet.domain.PetOnlineAuditLog;
import cn.thr.pethome.pet.mapper.PetDetailMapper;
import cn.thr.pethome.pet.mapper.PetMapper;
import cn.thr.pethome.pet.mapper.PetOnlineAuditLogMapper;
import cn.thr.pethome.pet.service.IPetService;
import cn.thr.pethome.base.service.Impl.BaseServiceImpl;
import cn.thr.pethome.user.domain.Employee;
import cn.thr.pethome.user.mapper.EmployeeMapper;
import cn.thr.pethome.util.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author thr
 * @since 2023-02-05
 */


/**
 *  上下架 状态
 *  创建时间
 *  狗归属的店铺      谁去录入就是谁的店铺id
 *  详细信息 没有关联上
 *
 *  1.先写常量写好  然后设置状态
 *  2.设置创建时间
 *  3.归属的店铺   谁去录入就是谁的店铺id
 *  4.详细信息
 *  5.用员工表查询自己的id 并且传给  pet ShopId 达到关联店铺
 *
 */
@Service
public class PetServiceImpl extends BaseServiceImpl<Pet> implements IPetService {

    @Autowired
    private PetMapper petMapper;

    @Autowired
    private LoginContextUtils loginContextUtils;

    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private PetDetailMapper petDetailMapper;

    @Autowired
    private PetOnlineAuditLogMapper petOnlineAuditLogMapper;

    @Autowired
    private AuthService authService;

    @Override
    public void add(Pet pet,HttpServletRequest req) {

        //3.1获取管理员自己的信息
        Employee loginUser =(Employee) loginContextUtils.getLoginUser(req);

        //1/设置状态
        pet.setState(BaseConstants.Pet.STATE_OFF);

        //2.设置创建时间
        pet.setCreatetime(new Date());

        //这里一定可以查到自己的id 并且传给petshopid
        Employee one = employeeMapper.findOne(loginUser.getId());

        //3.归属的店铺
        pet.setShopId(one.getId());


        super.add(pet);

        //4.宠物的详细信息   把petid 给PetDetail的pid 就能获得详细的信息
        PetDetail detail = pet.getDetail();
        detail.setPetId(pet.getId());
        //把宠物详细信息 添加进去
        petDetailMapper.add(detail);
    }

    @Override
    public void offsale(List<Long> ids) {
        petMapper.offsale(ids);
    }

    @Override
    public String onsale(List<Long> ids) {
        //获取全部pet 的id
        List<Pet> petList = petMapper.findByIds(ids);

        //获取全部下架的数据  获取Pet 里面的状态全部为0的数据
        Stream<Pet> offPetList = petList.stream().filter(pet -> pet.getState() == 0);

        //现在有两种情况  有审核通过(直接上架)  有审核失败的(提示给用户)
        List<Pet> errorPet = new ArrayList<>();

        //循环全部下价的数据
        offPetList.forEach(pet -> {
            if(authService.authentication(pet.getName())){//循环全部下来的数据的名字，通过Ai 来验证名称是否合规
                //合规
                PetOnlineAuditLog petOnlineAuditLog = new PetOnlineAuditLog();
                //就把 petid  放进PetOnlineAuditLog 的PetId 的里面
                petOnlineAuditLog.setPetId(pet.getId());
                //设置上架时间
                petOnlineAuditLog.setAuditTime(new Date());
                //设置状态为1
                petOnlineAuditLog.setState(BaseConstants.Pet.STATE_UP);
                //设置审核通过消息
                petOnlineAuditLog.setNote("审核通过");
                //把所有的数据添加进去
                petOnlineAuditLogMapper.add(petOnlineAuditLog);

                //设置pet 表的状态和 上架时间
                pet.setState(BaseConstants.Pet.STATE_UP);
                //设置上架时间
                pet.setOnsaletime(new Date());
                //调用petMapper 的修改方法来修改pet
                petMapper.update(pet);
            }else {
            errorPet.add(pet);
            }
        });
        if (errorPet.isEmpty()){ //如果errorPet 里面的错误信息为空就是上架成功 如果有就失败
            return "上架成功";
        }
        String errorMsg = "非法类容";
        for (int i = 0; i < errorPet.size(); i++) {
            if(i == 0){
                errorMsg = errorMsg + errorPet.get(i).getName();
            }else {
                errorMsg = errorMsg + "、" + errorPet.get(i).getName();
            }
        }
        return errorMsg;
    }

    @Override
    public void delete(Long id) {
        super.delete(id);
        //调用petDetail的方法来删除pid
        petDetailMapper.deleteById(id);

    }

    @Override
    public void update(Pet pet) {
        super.update(pet);
    }
}
